#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
模块名去重脚本
使用方法: python remove_duplicates.py <输入文件>
示例: python remove_duplicates.py modules.txt
"""

import sys
import os
from collections import Counter, OrderedDict

def remove_duplicates(input_file):
    """
    对单列模块名进行去重
    
    参数:
        input_file: 输入文件名
    """
    try:
        print(f"正在读取文件: {input_file}")
        
        # 读取文件
        with open(input_file, 'r', encoding='utf-8') as f:
            lines = [line.strip() for line in f if line.strip()]  # 读取并去除空白行
        
        if not lines:
            print("错误：文件为空或只包含空白行")
            return
        
        print(f"读取完成，原始行数: {len(lines)}")
        
        # 去重并保持顺序
        seen = set()
        unique_modules = []
        for line in lines:
            if line not in seen:
                seen.add(line)
                unique_modules.append(line)
        
        print(f"去重完成，唯一模块数: {len(unique_modules)}")
        print(f"删除的重复行数: {len(lines) - len(unique_modules)}")
        
        # 统计重复情况
        print("\n重复情况统计:")
        module_counts = Counter(lines)
        duplicates = {name: count for name, count in module_counts.items() if count > 1}
        
        if duplicates:
            print(f"有 {len(duplicates)} 个模块存在重复:")
            print("-" * 50)
            for name, count in sorted(duplicates.items(), key=lambda x: x[1], reverse=True):
                print(f"  {name}: 出现 {count} 次")
        else:
            print("没有重复模块")
        
        # 生成输出文件名（在输入文件名后添加_unique后缀）
        file_name, file_ext = os.path.splitext(input_file)
        output_file = f"{file_name}_unique{file_ext}"
        
        # 保存去重结果
        with open(output_file, 'w', encoding='utf-8') as f:
            for module in unique_modules:
                f.write(module + '\n')
        print(f"\n去重结果已保存到: {output_file}")
        
        # 生成统计报告
        report_file = f"{file_name}_report.txt"
        with open(report_file, 'w', encoding='utf-8') as f:
            f.write("模块去重统计报告\n")
            f.write("=" * 50 + "\n")
            f.write(f"原始文件: {input_file}\n")
            f.write(f"原始行数: {len(lines)}\n")
            f.write(f"去重后行数: {len(unique_modules)}\n")
            f.write(f"删除重复行数: {len(lines) - len(unique_modules)}\n")
            f.write(f"重复率: {(len(lines) - len(unique_modules)) / len(lines) * 100:.1f}%\n\n")
            
            if duplicates:
                f.write("重复模块统计:\n")
                f.write("-" * 40 + "\n")
                for name, count in sorted(duplicates.items(), key=lambda x: x[1], reverse=True):
                    f.write(f"{name}: {count}次\n")
            else:
                f.write("没有重复模块\n")
            
            f.write("\n" + "=" * 50 + "\n")
            f.write("去重后的模块列表:\n")
            f.write("-" * 40 + "\n")
            for i, module in enumerate(unique_modules, 1):
                f.write(f"{i:3d}. {module}\n")
        
        print(f"详细报告已保存到: {report_file}")
        
        # 在控制台显示前20个去重后的模块
        print(f"\n去重后的模块列表（显示前20个）:")
        print("-" * 40)
        for i, module in enumerate(unique_modules[:20], 1):
            print(f"{i:3d}. {module}")
        if len(unique_modules) > 20:
            print(f"... 以及另外 {len(unique_modules) - 20} 个模块")
            
    except FileNotFoundError:
        print(f"错误：找不到文件 '{input_file}'")
        print("请确保文件路径正确，且文件名拼写无误")
    except Exception as e:
        print(f"发生错误: {e}")
        print(f"错误类型: {type(e).__name__}")

def show_help():
    """显示帮助信息"""
    print("模块名去重工具")
    print("=" * 40)
    print("使用方法:")
    print("  python remove_duplicates.py <输入文件>")
    print()
    print("示例:")
    print("  python remove_duplicates.py modules.txt")
    print("  python remove_duplicates.py C:\\path\\to\\file.txt")
    print()
    print("说明:")
    print("  1. 输入文件应为纯文本文件，每行一个模块名")
    print("  2. 脚本会自动去除空白行")
    print("  3. 输出文件为输入文件名后加 '_unique' 后缀")
    print("  4. 同时会生成详细的统计报告文件")

def main():
    """主函数"""
    if len(sys.argv) != 2:
        show_help()
        sys.exit(1)
    
    input_file = sys.argv[1]
    
    # 检查文件是否存在
    if not os.path.exists(input_file):
        print(f"错误：文件 '{input_file}' 不存在")
        sys.exit(1)
    
    # 检查是否是文件
    if not os.path.isfile(input_file):
        print(f"错误：'{input_file}' 不是文件")
        sys.exit(1)
    
    # 执行去重
    remove_duplicates(input_file)

if __name__ == "__main__":
    main()